#include <iostream>
#include <string.h>
#include <mysql/mysql.h>

#define HOST "127.0.0.1"
#define POST 3306
#define USER "root"
#define PASSWD "2ZHENGLIANGANGYI"
#define DBNAME "gobang"

int main()
{
    // 1.测试mysql句柄
    MYSQL* mysql = mysql_init(nullptr);
    if(mysql == nullptr)
    {
        std::cout << "mysql init error...";
        return -1;
    }
    // 2.连接数据库
    if(mysql_real_connect(mysql,HOST,USER,PASSWD,DBNAME,POST,NULL,0)==nullptr)
    {
        std::cout << "connect mysql server error: " << mysql_error(mysql) <<std::endl;
        mysql_close(mysql);
        return -1;
    }
    // 3.设置客户端字符集
    if(mysql_set_character_set(mysql,"utf8")!=0)
    {
        std::cout << "set mysql character error: " << mysql_error(mysql) <<std::endl;
        mysql_close(mysql);
        return -1;
    }
    // 4.选择要操作的数据库
    // mysql_select_db(mysql,DBNAME);//实际上上面已经选择过了
    // 5.执行sql语句
    std::string sql = "insert stu values(null,'小明',10,100,100,100);";
    std::string sql2 = "update stu set ch=ch+20 where sn=1;";
    std::string sql3 = "delete from stu where sn=1;";
    std::string sql4 = "select * from stu;";
    int ret = mysql_query(mysql,sql4.c_str());
    if(ret != 0)
    {
        std::cout << sql4 << std::endl;
        std::cout << "mysql execute error: " << mysql_error(mysql) <<std::endl;
        mysql_close(mysql);
        return -1;
    }
    // 6.如果sql语句是查询，需要将结果保存到本地
    MYSQL_RES *res = mysql_store_result(mysql);
    if(res == nullptr)
    {
        mysql_close(mysql);
        return -1;
    }
    // 7.获取结果集中的结果条数
    int num_row = mysql_num_rows(res);
    int num_col = mysql_num_fields(res);
    // 8.遍历保存到本地的结果集
    for(int i = 0;i<num_row;i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res);
        for(int i = 0;i<num_col;i++)
        {
            std::cout<< row[i] << "\t";
        }
        std::cout<<std::endl;
    }
    // 9.释放结果集
    mysql_free_result(res);
    // 10.关闭连接，释放句柄
    mysql_close(mysql);
    return 0;
}